main() {
  // 1. 泛型类，约束数据结构为 String
  var dataSource = MyDataSource<String>();

  // 2. 调用方法，只能添加 String 类型的数据
  dataSource.pushData('张三');
  dataSource.pushData('李四');
  dataSource.pushData('王五');
  // dataSource.pushData(1); // 报错，类型不匹配
  print('当前数据的数量：${dataSource.totalCount()}');

  // 3. 调用方法，返回值类型也能识别
  var res = dataSource.getData(0); // res 类型推导是 String
  print('当前索引为 0 的数据是：$res');
}

// 抽象接口类，约束类的结构
abstract interface class IDataSource {
  int totalCount();
  dynamic getData(int index);
}

// 实现抽象接口类
class MyDataSource<T> implements IDataSource {
  // 私有的，避免被直接修改，通过泛型约束数据类型
  List<T> _dataArray = [];

  /// 获取数组长度
  @override
  int totalCount() {
    return _dataArray.length;
  }

  /// 获取数组元素
  @override
  T getData(int index) {
    return _dataArray[index];
  }

  // 新增自定义方法，如：添加数据
  void pushData(T data) {
    _dataArray.add(data);
  }

  // 新增自定义方法，如：清空数据
  void clearData() {
    _dataArray.clear();
  }
}
